class BranchPredictor:
    def __init__(self):
        # 使用一个简单的2位饱和计数器作为分支预测器
        # 初始化2位饱和计数器表，假设我们有16个分支指令需要预测
        self.branch_history = [2] * 16  # 默认每个分支指令预测为“取跳”
        
    def predict(self, branch_address):
        """
        预测分支是否跳转。
        :param branch_address: 分支指令的地址，用于索引分支历史表
        :return: 预测结果（True为跳转，False为不跳转）
        """
        index = branch_address % len(self.branch_history)
        state = self.branch_history[index]
        
        # 根据2位饱和计数器的状态预测
        # 00: 强烈不跳转, 01: 不跳转, 10: 跳转, 11: 强烈跳转
        return state >= 2
    
    def update(self, branch_address, taken):
        """
        更新分支预测历史表，根据分支是否被执行。
        :param branch_address: 分支指令的地址
        :param taken: 分支是否被实际执行（True为跳转，False为不跳转）
        """
        index = branch_address % len(self.branch_history)
        
        if taken:
            # 如果跳转且当前计数器小于3，则加一
            if self.branch_history[index] < 3:
                self.branch_history[index] += 1
        else:
            # 如果没有跳转且当前计数器大于0，则减一
            if self.branch_history[index] > 0:
                self.branch_history[index] -= 1
